#include "Queue.h"

/**
 * @brief 初始化队列
 * @param queue 队列指针
 */
void Queue_Init(Queue *queue) {
    queue->front = 0;
    queue->rear = 0;
    queue->count = 0;
}

/**
 * @brief 判断队列是否为空
 * @param queue 队列指针
 * @return true 队列为空，false 队列非空
 */
BOOL Queue_IsEmpty(Queue *queue) {
    return (queue->count == 0);
}

/**
 * @brief 判断队列是否已满
 * @param queue 队列指针
 * @return true 队列已满，false 队列未满
 */
BOOL Queue_IsFull(Queue *queue) {
    return (queue->count == QUEUE_MAX_SIZE);
}

/**
 * @brief 入队操作
 * @param queue 队列指针
 * @param data 要入队的数据
 * @return true 入队成功，false 入队失败（队列已满）
 */
BOOL Queue_Enqueue(Queue *queue, uint8_t dat) {
    if (Queue_IsFull(queue)) {
        return FALSE;  // 队列已满，入队失败
    }
    
    queue->dat[queue->rear] = dat;
    queue->rear = (queue->rear + 1) % QUEUE_MAX_SIZE;  // 循环队列
    queue->count++;
    
    return TRUE;
}

/**
 * @brief 出队操作
 * @param queue 队列指针
 * @param data 用于存储出队数据的指针
 * @return true 出队成功，false 出队失败（队列为空）
 */
BOOL Queue_Dequeue(Queue *queue, uint8_t *dat) {
    if (Queue_IsEmpty(queue)) {
        return FALSE;  // 队列为空，出队失败
    }
    
    *dat = queue->dat[queue->front];
    queue->front = (queue->front + 1) % QUEUE_MAX_SIZE;  // 循环队列
    queue->count--;
    
    return TRUE;
}

/**
 * @brief 获取队列中元素个数
 * @param queue 队列指针
 * @return 队列中元素个数
 */
uint8_t Queue_GetCount(Queue *queue) {
    return queue->count;
}